home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer (Italian) 48 / PC Gamer IT CD 48 2-2.iso / Starsiege / tribesdemo.exe / Disk1 / data1.cab / Tribes_Demo / base / scripts.vol / objectives.cs < prev    next >
Encoding:
Text File  |  1999-09-14  |  48.6 KB  |  1,350 lines

  1. exec("game.cs");                                
  2. $flagReturnTime = 45;
  3.  
  4. function ObjectiveMission::missionComplete()
  5. {
  6.    $missionComplete = true;
  7.    %group = nameToID("MissionCleanup/ObjectivesSet");
  8.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  9.    {
  10.       ObjectiveMission::objectiveChanged(%obj);
  11.     }
  12.    for(%i = 0; %i < getNumTeams(); %i++) { 
  13.        Team::setObjective(%i, $firstObjectiveLine-4, " ");
  14.        Team::setObjective(%i, $firstObjectiveLine-3, "<f5>Mission Summary:");
  15.        Team::setObjective(%i, $firstObjectiveLine-2, " ");
  16.     }
  17.     ObjectiveMission::setObjectiveHeading();
  18.    ObjectiveMission::refreshTeamScores();
  19.     %lineNum = "";
  20.    $missionComplete = false;
  21.  
  22.    // back out of all the functions...
  23.    schedule("Server::nextMission();", 0);
  24. }
  25.  
  26. function ObjectiveMission::setObjectiveHeading()
  27. {
  28.    if($missionComplete)
  29.    {
  30.       %curLeader = 0;
  31.         %tieGame = false;
  32.         %tie = 0;
  33.         %tieTeams[%tie] = %curLeader; 
  34.         for(%i = 0; %i < getNumTeams() ; %i++) 
  35.            echo("GAME: teamfinalscore " @ %i @ " " @ $teamScore[%i]);
  36.       
  37.         for(%i = 1; %i < getNumTeams() ; %i++) 
  38.       {
  39.            if($teamScore[%i] == $teamScore[%curLeader]) { 
  40.             %tieGame = true;
  41.              %tieTeams[%tie++] = %i;
  42.             }
  43.             else if($teamScore[%i] > $teamScore[%curLeader])
  44.          {
  45.             %curLeader = %i;       
  46.             %tieGame = false;
  47.                 %tie = 0;
  48.                 %tieTeams[%tie] = %curLeader; 
  49.          }
  50.       }
  51.         if(%tieGame) {
  52.             for(%g = 0; %g <= %tie; %g++) { 
  53.                 %names = %names @ getTeamName(%tieTeams[%g]);
  54.                 if(%g == %tie-1)
  55.                     %names = %names @ " and "; 
  56.                 else if(%g != %tie)
  57.                     %names = %names @ ", "; 
  58.             }
  59.             if(%tie > 1) 
  60.                  %names = %names @ " all"; 
  61.         }
  62.         for(%i = -1; %i < getNumTeams(); %i++)
  63.       {
  64.             objective::displayBitmap(%i,0);
  65.             if(!%tieGame) {
  66.              if(%i == %curLeader) { 
  67.                     if($teamScore[%curLeader] == 1)
  68.                        Team::setObjective(%i, 1, "<F5>           Your team won the mission with " @ $teamScore[%curLeader] @ " point!");
  69.                     else
  70.                        Team::setObjective(%i, 1, "<F5>           Your team won the mission with " @ $teamScore[%curLeader] @ " points!");
  71.                 }
  72.                 else {
  73.                     if($teamScore[%curLeader] == 1)
  74.                         Team::setObjective(%i, 1, "<F5>     The " @ getTeamName(%curLeader) @ " team won the mission with " @ $teamScore[%curLeader] @ " point!");
  75.                       else
  76.                       Team::setObjective(%i, 1, "<F5>     The " @ getTeamName(%curLeader) @ " team won the mission with " @ $teamScore[%curLeader] @ " points!");
  77.                 }
  78.               }    
  79.             else {
  80.                 if(getNumTeams() > 2) {
  81.                     Team::setObjective(%i, 1, "<F5>     The " @ %names @ " tied with a score of " @ $teamScore[%curLeader]);
  82.                }
  83.                 else
  84.                     Team::setObjective(%i, 1, "<F5>     The mission ended in a tie where each team had a score of " @ $teamScore[%curLeader]);
  85.             }
  86.             Team::setObjective(%i, 2, " ");
  87.         }
  88.    }
  89.    else {
  90.       for(%i = -1; %i < getNumTeams(); %i++)
  91.       {
  92.             objective::displayBitmap(%i,0);
  93.               Team::setObjective(%i,1, "<f5>Mission Completion:");
  94.            Team::setObjective(%i, 2,"<f1>   - " @ $teamScoreLimit @ " points needed to win the mission.");
  95.         }
  96.     }
  97.    if(!$Server::timeLimit)
  98.       %str = "<f1>   - No time limit on the game.";
  99.    else if($timeLimitReached)
  100.       %str = "<f1>   - Time limit reached.";
  101.    else if($missionComplete)
  102.    {
  103.       %time = getSimTime() - $missionStartTime;
  104.       %minutes = Time::getMinutes(%time);
  105.       %seconds = Time::getSeconds(%time);
  106.       if(%minutes < 10)
  107.          %minutes = "0" @ %minutes;
  108.       if(%seconds < 10)
  109.          %seconds = "0" @ %seconds;
  110.       %str = "<f1>   - Total match time: " @ %minutes @ ":" @ %seconds;
  111.    }
  112.    else
  113.       %str = "<f1>   - Time remaining: " @ floor($Server::timeLimit - (getSimTime() - $missionStartTime) / 60) @ " minutes.";
  114.    for(%i = -1; %i < getNumTeams(); %i++) {
  115.           Team::setObjective(%i, 3, " ");
  116.           Team::setObjective(%i, 4, "<f5>Mission Information:");
  117.         Team::setObjective(%i, 5, "<f1>   - Mission Name: " @ $missionName); 
  118.       Team::setObjective(%i, 6, %str);
  119.     }
  120. }
  121.  
  122. function objective::displayBitmap(%team, %line)
  123. {
  124.     if($TestMissionType == "CTF") {
  125.         %bitmap1 = "capturetheflag1.bmp";
  126.         %bitmap2 = "capturetheflag2.bmp";
  127.     }
  128.     else if($TestMissionType == "C&H") {
  129.         %bitmap1 = "captureandhold1.bmp";
  130.         %bitmap2 = "captureandhold2.bmp";
  131.     }
  132.     else if($TestMissionType == "D&D") {
  133.         %bitmap1 = "defendanddest1.bmp";
  134.         %bitmap2 = "defendanddest2.bmp";
  135.     }       
  136.     else if($TestMissionType == "F&R") {
  137.         %bitmap1 = "findandret1.bmp";
  138.         %bitmap2 = "findandret2.bmp";
  139.     }
  140.     if(%bitmap1 == "" || %bitmap2 == "")
  141.          Team::setObjective(%team, %line, " ");
  142.     else
  143.          Team::setObjective(%team, %line, "<jc><B0,0:" @ %bitmap1 @ "><B0,0:" @ %bitmap2 @ ">");
  144. }
  145.  
  146. function Game::checkTimeLimit()
  147. {
  148.    // if no timeLimit set or timeLimit set to 0,
  149.    // just reschedule the check for a minute hence
  150.    $timeLimitReached = false;
  151.    ObjectiveMission::setObjectiveHeading();
  152.  
  153.    if(!$Server::timeLimit)
  154.    {
  155.       schedule("Game::checkTimeLimit();", 60);
  156.       return;
  157.    }
  158.  
  159.    %curTimeLeft = ($Server::timeLimit * 60) + $missionStartTime - getSimTime();
  160.    if(%curTimeLeft <= 0 && $matchStarted)
  161.    {
  162.       echo("GAME: timelimit");
  163.       $timeLimitReached = true;
  164.       //echo("checking for objective time limit status...");
  165.       %set = nameToID("MissionCleanup/ObjectiveSet");
  166.       for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  167.          GameBase::virtual(%obj, "timeLimitReached", %clientId);
  168.       ObjectiveMission::missionComplete();
  169.    }
  170.    else
  171.    {
  172.       if(%curTimeLeft >= 20)
  173.          schedule("Game::checkTimeLimit();", 20);
  174.       else
  175.          schedule("Game::checkTimeLimit();", %curTimeLeft + 1);
  176.       UpdateClientTimes(%curTimeLeft);
  177.    }
  178. }
  179.  
  180. function Vote::changeMission()
  181. {
  182.    $missionComplete = true;
  183.    ObjectiveMission::refreshTeamScores();
  184.    %group = nameToID("MissionCleanup/ObjectivesSet");
  185.     %lineNum = "";
  186.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  187.    {
  188.       ObjectiveMission::objectiveChanged(%obj);
  189.     }
  190.    for(%i = 0; %i < getNumTeams(); %i++) { 
  191.        Team::setObjective(%i, $firstObjectiveLine-2, " ");
  192.        Team::setObjective(%i, $firstObjectiveLine-1, "<f5>Mission Summary:");
  193.     }
  194.     ObjectiveMission::setObjectiveHeading();
  195.    $missionComplete = false;
  196. }
  197.  
  198. function ObjectiveMission::checkScoreLimit()
  199. {
  200.    %done = false;
  201.    ObjectiveMission::refreshTeamScores();
  202.  
  203.    for(%i = 0; %i < getNumTeams(); %i++)
  204.       if($teamScore[%i] >= $teamScoreLimit)
  205.          %done = true;
  206.  
  207.    if(%done)
  208.       ObjectiveMission::missionComplete();
  209. }
  210.  
  211. function ObjectiveMission::checkPoints()
  212. {
  213.    for(%i = 0; %i < getNumTeams(); %i++)
  214.       $teamScore[%i] += $deltaTeamScore[%i] / 12;
  215.    schedule("ObjectiveMission::checkPoints();", 5);
  216.    ObjectiveMission::checkScoreLimit();
  217. }
  218.  
  219. function ObjectiveMission::initCheck(%object)
  220. {
  221.     if($TestMissionType == "") {
  222.         %name = gamebase::getdataname(%object); 
  223.        if(%name == Flag) { 
  224.             if(gamebase::getteam(%object) != -1)
  225.                 $TestMissionType = "CTF";
  226.             else
  227.             $TestMissionType = "F&R";
  228.         }
  229.         else if(%object.objectiveName != "" && %object.scoreValue)
  230.             $TestMissionType = "D&D";
  231.         else if(%name == TowerSwitch)
  232.             $NumTowerSwitchs++;
  233.     }
  234.  
  235.    %object.trainingObjectiveComplete = "";
  236.    %object.objectiveLine = "";
  237.    if(GameBase::virtual(%object, objectiveInit))
  238.       addToSet("MissionCleanup/ObjectivesSet", %object);
  239. }
  240.  
  241. function Game::refreshClientScore(%clientId)
  242. {
  243.    %team = Client::getTeam(%clientId);
  244.    if(%team == -1) // observers go last.
  245.       %team = 9;
  246.    // objective mission sorts by team first.
  247.    Client::setScore(%clientId, "%n\t%t\t  " @ %clientId.score  @ "\t%p\t%l", %clientId.score + (9 - %team) * 10000);
  248. //   Client::setScore(%clientId, "%n\t%t\t  " @ %clientId.score, %clientId.score);
  249. }
  250.  
  251. function ObjectiveMission::refreshTeamScores()
  252. {
  253.    %nt = getNumTeams();
  254.    Team::setScore(-1, "%t\t  0", 0);
  255.    for(%i = -1; %i < %nt; %i++)
  256.    {
  257.       Team::setScore(%i, "%t\t  " @ $teamScore[%i], $teamScore[%i]);
  258.       for(%j = 0; %j < %nt; %j++) 
  259.          Team::setObjective(%i,%j+$firstTeamLine, "<f1>   - Team " @ getTeamName(%j) @ " score = " @ $teamScore[%j]);
  260.    }
  261. }
  262.  
  263. function ObjectiveMission::objectiveChanged(%this)
  264. {
  265.     if(%this.objectiveLine)
  266.       for(%i = -1; %i < getNumTeams(); %i++)
  267.          Team::setObjective(%i,%this.objectiveLine, 
  268.             "<f1> " @ GameBase::virtual(%this, getObjectiveString, %i));
  269. }
  270.  
  271.  
  272. function Mission::init()
  273. {
  274.    setClientScoreHeading("Player Name\t\x6FTeam\t\xA6Score\t\xCFPing\t\xEFPL");
  275. //   setClientScoreHeading("Player Name\t\x6FTeam\t\xD6Score");//\t\xFFPing\t\xFFPL");
  276.    setTeamScoreHeading("Team Name\t\xD6Score");
  277.  
  278.    $firstTeamLine = 7;
  279.    $firstObjectiveLine = $firstTeamLine + getNumTeams() + 1;
  280.    for(%i = -1; %i < getNumTeams(); %i++)
  281.    {
  282.       $teamFlagStand[%i] = "";
  283.         $teamFlag[%i] = "";
  284.       Team::setObjective(%i, $firstTeamLine - 1, " ");
  285.       Team::setObjective(%i, $firstObjectiveLine - 1, " ");
  286.       Team::setObjective(%i, $firstObjectiveLine, "<f5>Mission Objectives: ");
  287.       $firstObjectiveLine++;
  288.         $deltaTeamScore[%i] = 0;
  289.       $teamScore[%i] = 0;
  290.       newObject("TeamDrops" @ %i, SimSet);
  291.       addToSet(MissionCleanup, "TeamDrops" @ %i);
  292.       %dropSet = nameToID("MissionGroup/Teams/Team" @ %i @ "/DropPoints/Random");
  293.       for(%j = 0; (%dropPoint = Group::getObject(%dropSet, %j)) != -1; %j++)
  294.          addToSet("MissionCleanup/TeamDrops" @ %i, %dropPoint);
  295.    }
  296.    $numObjectives = 0;
  297.    newObject(ObjectivesSet, SimSet);
  298.    addToSet(MissionCleanup, ObjectivesSet);
  299.    
  300.    Group::iterateRecursive(MissionGroup, ObjectiveMission::initCheck);
  301.    %group = nameToID("MissionCleanup/ObjectivesSet");
  302.  
  303.     ObjectiveMission::setObjectiveHeading();
  304.    for(%i = 0; (%obj = Group::getObject(%group, %i)) != -1; %i++)
  305.    {
  306.       %obj.objectiveLine = %i + $firstObjectiveLine;
  307.       ObjectiveMission::objectiveChanged(%obj);
  308.    }
  309.    ObjectiveMission::refreshTeamScores();
  310.    for(%cl = Client::getFirst(); %cl != -1; %cl = Client::getNext(%cl))
  311.    {
  312.       %cl.score = 0;
  313.       Game::refreshClientScore(%cl);
  314.    }
  315.    schedule("ObjectiveMission::checkPoints();", 5);
  316.  
  317.     if($TestMissionType == "") {
  318.         if($NumTowerSwitchs) 
  319.             $TestMissionType = "C&H";
  320.         else 
  321.             $TestMissionType = "NONE";        
  322.         $NumTowerSwitchs = "";
  323.     }
  324. }
  325.  
  326. function Game::pickRandomSpawn(%team)
  327. {
  328.    %spawnSet = nameToID("MissionCleanup/TeamDrops" @ %team);
  329.    %spawnCount = Group::objectCount(%spawnSet);
  330.    if(!%spawnCount)
  331.       return -1;
  332.       %spawnIdx = floor(getRandom() * (%spawnCount - 0.1));
  333.       %value = %spawnCount;
  334.     for(%i = %spawnIdx; %i < %value; %i++) {
  335.         %set = newObject("set",SimSet);
  336.         %obj = Group::getObject(%spawnSet, %i);
  337.         if(containerBoxFillSet(%set,$SimPlayerObjectType|$VehicleObjectType,GameBase::getPosition(%obj),2,2,4,0) == 0) {
  338.             deleteObject(%set);
  339.             return %obj;        
  340.         }
  341.         if(%i == %spawnCount - 1) {
  342.             %i = -1;
  343.             %value = %spawnIdx;
  344.         }
  345.         deleteObject(%set);
  346.     }
  347.    return false;
  348. }
  349.  
  350. //handles all scoring based on distance to Towers
  351. function Client::leaveGame(%clientId)
  352. {
  353.    echo("GAME: clientdrop " @ %clientId);
  354.    %set = nameToID("MissionCleanup/ObjectivesSet");
  355.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  356.       GameBase::virtual(%obj, "clientDropped", %clientId);
  357. }
  358.  
  359. function Game::clientKilled(%playerId, %killerId)
  360. {
  361.    %set = nameToID("MissionCleanup/ObjectivesSet");
  362.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  363.       GameBase::virtual(%obj, "clientKilled", %playerId, %killerId);
  364. }
  365.  
  366. function Player::enterMissionArea(%this)
  367. {
  368.    %set = nameToID("MissionCleanup/ObjectivesSet");
  369.     %this.outArea = "";
  370.    for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  371.       GameBase::virtual(%obj, "playerEnterMissionArea", %this);
  372. }
  373.  
  374. function Player::leaveMissionArea(%this)
  375. {
  376.     %this.outArea=1;
  377.     Client::sendMessage(Player::getClient(%this),1,"You have left the mission area.");
  378.     alertPlayer(%this, 3);
  379. }
  380.    
  381. function alertPlayer(%player, %count)
  382. {
  383.     if(%player.outArea == 1) {
  384.         if(%count > 0) {
  385.               Client::sendMessage(Player::getClient(%player),0,"~wLeftMissionArea.wav");
  386.            schedule("alertPlayer(" @ %player @ ", " @ %count - 1 @ ");",1.5,%player);
  387.         }
  388.         else { 
  389.             %set = nameToID("MissionCleanup/ObjectivesSet");
  390.             for(%i = 0; (%obj = Group::getObject(%set, %i)) != -1; %i++)
  391.                   GameBase::virtual(%obj, "playerLeaveMissionArea", %player);
  392.         }
  393.     }
  394. }
  395. function checkObjectives(%this)
  396. {
  397.    //echo("checking for objective player leave mission area...");
  398. }
  399.  
  400. // objective init must return true
  401. function TowerSwitch::objectiveInit(%this)
  402. {
  403.    return %this.scoreValue || %this.deltaTeamScore;
  404. }
  405.  
  406. function TowerSwitch::onAdd(%this)
  407. {
  408.     %this.numSwitchTeams = 0;    
  409. }
  410.  
  411. function TowerSwitch::onDamage()
  412. {
  413.    // tower switches can't take damage
  414. }
  415.  
  416. function TowerSwitch::getObjectiveString(%this, %forTeam)
  417. {
  418.    %thisTeam = GameBase::getTeam(%this);
  419.    
  420.    if($missionComplete)
  421.    {
  422.       if(%thisTeam == -1)
  423.          return "<Btowers_neutral.bmp>\nNo team claimed " @ %this.objectiveName @ ".";
  424.       else if(%thisTeam == %forTeam)
  425.          return "<Btower_teamcontrol.bmp>\nYour team finished the mission in control of " @ %this.objectiveName @ ".";
  426.       else {
  427.            if(%forTeam != -1)
  428.                return "<Btower_enemycontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  429.            else
  430.                return "<Btower_teamcontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  431.         }
  432.     }
  433.    else
  434.    {
  435.         if(%forTeam != -1) {
  436.              if(%this.deltaTeamScore)
  437.              {                                                                      
  438.                 if(%thisTeam == -1)
  439.                     return "<Btowers_neutral.bmp>\nClaim " @ %this.objectiveName @ " to gain " @ %this.deltaTeamScore @ " points per minute."; 
  440.                 else if(%thisTeam == %forTeam)
  441.                    return "<Btower_teamcontrol.bmp>\nDefend " @ %this.objectiveName @ " to retain " @ %this.deltaTeamScore @ " points per minute.";
  442.                 else
  443.                    return "<Btower_enemycontrol.bmp>\nCapture " @ %this.objectiveName @ " from the " @ getTeamName(%thisTeam) @ " team to gain " @ %this.deltaTeamScore @ " points per minute.";
  444.             }
  445.              else if(%this.scoreValue)
  446.              {
  447.                  if(%thisTeam == -1)
  448.                    return "<Btowers_neutral.bmp>\nClaim and defend " @ %this.objectiveName @ " to gain " @ %this.scoreValue @ " points.";
  449.                 else if(%thisTeam == %forTeam)
  450.                    return "<Btower_teamcontrol.bmp>\nDefend " @ %this.objectiveName @ " to retain " @ %this.scoreValue @ " points.";
  451.                 else
  452.                    return "<Btower_enemycontrol.bmp>\nCapture " @ %this.objectiveName @ " from the " @ getTeamName(%thisTeam) @ " team to gain " @ %this.deltaTeamScore @ " points.";
  453.               }
  454.         }
  455.         else {
  456.              if(%thisTeam == -1)
  457.                    return "<Btowers_neutral.bmp>\n" @ %this.objectiveName @ " has not been claimed."; 
  458.              else
  459.                 return "<Btower_teamcontrol.bmp>\nThe " @ getTeamName(%thisTeam) @ " team is in control of the " @ %this.objectiveName @ ".";
  460.           }
  461.    }
  462. }
  463.  
  464. function TowerSwitch::onCollision(%this, %object)
  465. {
  466.    //echo("switch collision ", %object);
  467.    if(getObjectType(%object) != "Player")
  468.       return;
  469.  
  470.    if(Player::isDead(%object))
  471.       return;
  472.  
  473.    %playerTeam = GameBase::getTeam(%object);
  474.    %oldTeam = GameBase::getTeam(%this);
  475.    if(%oldTeam == %playerTeam)
  476.       return;
  477.  
  478.    %this.trainingObjectiveComplete = true;
  479.    
  480.    %playerClient = Player::getClient(%object);
  481.    %touchClientName = Client::getName(%playerClient);
  482.    %group = GetGroup(%this);
  483.    Group::iterateRecursive(%group, GameBase::setTeam, %playerTeam);
  484.  
  485.    %dropPoints = nameToID(%group @ "/DropPoints");
  486.    %oldDropSet = nameToID("MissionCleanup/TeamDrops" @ %oldTeam);
  487.    %newDropSet = nameToID("MissionCleanup/TeamDrops" @ %playerTeam);
  488.  
  489.    $deltaTeamScore[%oldTeam] -= %this.deltaTeamScore;
  490.    $deltaTeamScore[%playerTeam] += %this.deltaTeamScore;
  491.    $teamScore[%oldTeam] -= %this.scoreValue;
  492.    $teamScore[%playerTeam] += %this.scoreValue;
  493.  
  494.    if(%dropPoints != -1)
  495.    {
  496.       for(%i = 0; (%dropPoint = Group::getObject(%dropPoints, %i)) != -1; %i++)
  497.       {
  498.          if(%oldDropSet != -1)
  499.             removeFromSet(%oldDropSet, %dropPoint);
  500.          addToSet(%newDropSet, %dropPoint);
  501.       }
  502.    }
  503.  
  504.    if(%oldTeam == -1)
  505.    {
  506.       MessageAllExcept(%playerClient, 0, %touchClientName @ " claimed " @ %this.objectiveName @ " for the " @ getTeamName(%playerTeam) @ " team!");
  507.       Client::sendMessage(%playerClient, 0, "You claimed " @ %this.objectiveName @ " for the " @ getTeamName(%playerTeam) @ " team!");
  508.      }
  509.    else
  510.    {
  511.       if(%this.objectiveLine)
  512.       {
  513.          MessageAllExcept(%playerClient, 0, %touchClientName @ " captured " @ %this.objectiveName @ " from the " @ getTeamName(%oldTeam) @ " team!");
  514.          Client::sendMessage(%playerClient, 0, "You captured " @ %this.objectiveName @ " from the " @ getTeamName(%oldTeam) @ " team!");
  515.             %this.numSwitchTeams++;    
  516.             schedule("TowerSwitch::timeLimitCheckPoints(" @ %this @ "," @ %playerClient @ "," @ %this.numSwitchTeams @ ");",60);
  517.       }
  518.    }
  519.    if(%this.objectiveLine)
  520.    {
  521.       TeamMessages(1, %playerTeam, "Your team has taken an objective.~wCapturedTower.wav");
  522.         TeamMessages(0, %playerTeam, "The " @ getTeamName(%playerTeam) @ " has taken an objective.");
  523.         if(%oldTeam != -1)
  524.           TeamMessages(1, %oldTeam, "The " @ getTeamName(%playerTeam) @ " team has taken your objective.~wLostTower.wav");
  525.       ObjectiveMission::ObjectiveChanged(%this);
  526.    }
  527.    ObjectiveMission::checkScoreLimit();
  528. }
  529.  
  530. function TowerSwitch::timeLimitCheckPoints(%this,%client,%numChange)
  531. {
  532.    //give player 5 points for capturing tower!
  533.     if(%this.numSwitchTeams == %numChange) {
  534.        %client.score+=5;
  535.         Game::refreshClientScore(%client);
  536.        Client::sendMessage(%client, 0, "You receive 5 points for holding your captured tower!");
  537.     }
  538. }
  539.  
  540. function TowerSwitch::clientKilled(%this, %playerId, %killerId)
  541. {      
  542.    if(!%this.objectiveLine)
  543.       return;
  544.  
  545.    %killerTeam = Client::getTeam(%killerId);
  546.    %playerTeam = Client::getTeam(%playerId);
  547.    %killerPos = GameBase::getPosition(%killerId);
  548.       
  549.    if(%killerId && (%playerTeam != %killerTeam))
  550.    {   
  551.       %dist = Vector::getDistance(%killerPos, GameBase::getPosition(%this));
  552.       //echo(%dist);
  553.       if(%dist <= 80)
  554.       {
  555.          //echo("distance to objective" @ %this @ " : " @ %dist);
  556.          if(GameBase::getTeam(%this) == Client::getTeam(%killerId) && getObjectType(%killerId) == "Player")
  557.          {
  558.             %killerId.score++;
  559.             Game::refreshClientScore(%killerId);
  560.             messageAll(0, strcat(Client::getName(%killerId), " receives a bonus for defending " @ %this.objectiveName @ "."));
  561.          }
  562.       }
  563.    }
  564. }
  565.  
  566. // objective init must return true
  567. function Flag::objectiveInit(%this)
  568. {
  569.    %this.originalPosition = GameBase::getPosition(%this);
  570.    %this.atHome = true;
  571.    %this.pickupSequence = 0;
  572.    %this.carrier = -1;
  573.    %this.holdingTeam = -1;
  574.    %this.holder = "";
  575.     %this.changeTeamCount = 0;
  576.  
  577.    %this.enemyCaps = 0;
  578.    %this.caps[0] = 0;
  579.    %this.caps[1] = 0;
  580.    %this.caps[2] = 0;
  581.    %this.caps[3] = 0;
  582.    %this.caps[4] = 0;
  583.    %this.caps[5] = 0;
  584.    %this.caps[6] = 0;
  585.    %this.caps[7] = 0;
  586.  
  587.     $teamFlag[GameBase::getTeam(%this)] = %this;
  588.  
  589.    return true;
  590. }
  591.  
  592. function Flag::getObjectiveString(%this, %forTeam)
  593. {
  594.    %thisTeam = GameBase::getTeam(%this);
  595.    //echo("Flag objectiveString");
  596.    
  597.    if($missionComplete)
  598.    {
  599.       if(%thisTeam == -1)
  600.       {
  601.          if(%this.holdingTeam == %forTeam && %forTeam != -1)
  602.             return "<Bflag_atbase.bmp>\nYour team finished the mission in control of " @ %this.objectiveName @ ".";
  603.          else if(%this.holdingTeam == -1)
  604.             return "<Bflag_neutral.bmp>\nNo team finished the mission in control of " @ %this.objectiveName @ ".";
  605.          else {
  606.                 if(%forTeam != -1)
  607.                     return "<Bflag_enemycaptured.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  608.               else
  609.                     return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team finished the mission in control of " @ %this.objectiveName @ ".";
  610.             }
  611.         }
  612.       else if(%forTeam != -1)
  613.       {
  614.          if(%thisTeam == %forTeam)
  615.             return "<Bflag_atbase.bmp>\nYour flag was captured " @ %this.enemyCaps @ " times.";
  616.          else
  617.             return "<Bflag_enemycaptured.bmp>\nYour team captured the " @ getTeamName(%thisTeam) @ " flag " @ %this.caps[%forTeam] @ " times.";
  618.       }
  619.           else 
  620.           return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%thisTeam) @ "'s flag was captured " @ %this.enemyCaps @ " times.";
  621.    }
  622.    else
  623.    {
  624.       if(%thisTeam == -1)
  625.       {
  626.             if(%forTeam != -1) {
  627.              if(%this.holdingTeam == %forTeam)
  628.                 return "<Bflag_atbase.bmp>\nDefend " @ %this.objectiveName @ ".";
  629.              else if(%this.holdingTeam != -1)
  630.                 return "<Bflag_enemycaptured.bmp>\nGrab " @ %this.objectiveName @ " from the " @ getTeamName(%this.holdingTeam) @ " team.";
  631.              else if(%this.carrier != -1)
  632.              {
  633.                 if(GameBase::getTeam(%this.carrier) == %forTeam)
  634.                    return "<Bflag_atbase.bmp>\nConvey " @ %this.objectiveName @ " to an empty flag stand. (carried by " @ Client::getName(Player::getClient(%this.carrier)) @ ")";
  635.                 else
  636.                    return "<Bflag_enemycaptured.bmp>\nWaylay " @ Client::getName(Player::getClient(%this.carrier)) @ " and convey " @ %this.objectiveName @ " to your base.";
  637.              }
  638.              else if(%this.atHome)
  639.                 return "<Bflag_neutral.bmp>\nGrab " @ %this.objectiveName @ " and convey it to an empty flag stand.";
  640.              else
  641.                 return "<Bflag_notatbase.bmp>\nFind " @ %this.objectiveName @ " and convey it to an empty flag stand.";
  642.           }
  643.             else {
  644.              if(%this.holdingTeam != -1)
  645.                 return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%this.holdingTeam) @ " team has " @ %this.objectiveName @ ".";
  646.              else if(%this.carrier != -1)
  647.                   return "<Bflag_atbase.bmp>\n" @ Client::getName(Player::getClient(%this.carrier)) @ " has " @ %this.objectiveName @ ".";
  648.              else if(%this.atHome)
  649.                 return "<Bflag_neutral.bmp>\n" @ %this.objectiveName @ " has not been found.";
  650.                 else
  651.                    return "<Bflag_notatbase.bmp>\n" @ %this.objectiveName @ " has been dropped in the field.";
  652.             }
  653.         }
  654.       else
  655.       {
  656.          if(%thisTeam == %forTeam)
  657.          {
  658.             if(%this.atHome)
  659.                return "<Bflag_atbase.bmp>\nDefend your flag to prevent enemy captures.";
  660.             else if(%this.carrier != -1)
  661.                return "<Bflag_enemycaptured.bmp>\nReturn your flag to base. (carried by " @ Client::getName(Player::getClient(%this.carrier)) @ ")";
  662.             else
  663.                return "<Bflag_notatbase.bmp>\nReturn your flag to base. (dropped in the field)";
  664.          }
  665.          else
  666.          {
  667.                 if(%forTeam != -1) {
  668.                 if(%this.atHome)
  669.                    return "<Bflag_enemycaptured.bmp>\nGrab the " @ getTeamName(%thisTeam) @ " flag and touch it to your's to score " @ %this.scoreValue @ " points.";
  670.                 else if(%this.carrier == -1)
  671.                    return "<Bflag_notatbase.bmp>\nFind the " @ getTeamName(%thisTeam) @ " flag and touch it to your's to score " @ %this.scoreValue @ " points.";
  672.                 else if(GameBase::getTeam(%this.carrier) == %forTeam)
  673.                    return "<Bflag_atbase.bmp>\nEscort friendly carrier " @ Client::getName(Player::getClient(%this.carrier)) @ " to base.";
  674.                 else
  675.                    return "<Bflag_enemycaptured.bmp>\nWaylay enemy carrier " @ Client::getName(Player::getClient(%this.carrier)) @ " and steal his flag.";
  676.              }
  677.                 else {
  678.                 if(%this.atHome)
  679.                    return "<Bflag_atbase.bmp>\nThe " @ getTeamName(%thisTeam) @ " flag is at their base.";
  680.                 else if(%this.carrier == -1)
  681.                    return "<Bflag_notatbase.bmp>\nThe " @ getTeamName(%thisTeam) @ " flag has been dropped in the field.";
  682.                 else 
  683.                    return "<Bflag_atbase.bmp>\n" @ Client::getName(Player::getClient(%this.carrier)) @ " has the " @ getTeamName(%thisTeam) @ " flag.";
  684.                 }
  685.             }         
  686.       }
  687.    }
  688. }
  689.  
  690. function Flag::onDrop(%player, %type)
  691. {
  692.    %playerTeam = GameBase::getTeam(%player);
  693.    %flag = %player.carryFlag;
  694.    %flagTeam = GameBase::getTeam(%flag);
  695.    %playerClient = Player::getClient(%player);
  696.    %dropClientName = Client::getName(%playerClient);
  697.  
  698.    if(%flagTeam == -1)
  699.    {
  700.       MessageAllExcept(%playerClient, 1, %dropClientName @ " dropped " @ %flag.objectiveName @ "!");
  701.       Client::sendMessage(%playerClient, 1, "You dropped "  @ %flag.objectiveName @ "!");
  702.    }
  703.    else
  704.    {
  705.       MessageAllExcept(%playerClient, 0, %dropClientName @ " dropped the " @ getTeamName(%flagTeam) @ " flag!");
  706.       Client::sendMessage(%playerClient, 0, "You dropped the " @ getTeamName(%flagTeam) @ " flag!");
  707.       TeamMessages(1, %flagTeam, "Your flag was dropped in the field.", -2, "", "The " @ getTeamName(%flagTeam) @ " flag was dropped in the field.");
  708.    }
  709.    GameBase::throw(%flag, %player, 10, false);
  710.    Item::hide(%flag, false);
  711.    Player::setItemCount(%player, "Flag", 0);
  712.    %flag.carrier = -1;
  713.    %player.carryFlag = "";
  714.    Flag::clearWaypoint(%playerClient, false);
  715.  
  716.    schedule("Flag::checkReturn(" @ %flag @ ", " @ %flag.pickupSequence @ ");", $flagReturnTime);
  717.     %flag.dropFade = 1;
  718.    ObjectiveMission::ObjectiveChanged(%flag);
  719. }
  720.  
  721. function Flag::checkReturn(%flag, %sequenceNum)
  722. {
  723.    //echo("checking for flag return: ", %flag, ", ", %sequenceNum);
  724.    if(%flag.pickupSequence == %sequenceNum && %flag.timerOn == "")
  725.    {
  726.         if(%flag.dropFade) { 
  727.             GameBase::startFadeOut(%flag);
  728.               %flag.dropFade= "";
  729.             %flag.fadeOut= 1;
  730.            schedule("Flag::checkReturn(" @ %flag @ ", " @ %sequenceNum @ ");", 2.5);
  731.         }
  732.         else {
  733.           %flagTeam = GameBase::getTeam(%flag);
  734.           if(%flagTeam == -1)
  735.           {
  736.              if(%flag.flagStand == "" || %flag.flagStand.flag != "") {
  737.                     MessageAll(0, %flag.objectiveName @ " was returned to its initial position.");
  738.                    GameBase::setPosition(%flag, %flag.originalPosition);
  739.                Item::setVelocity(%flag, "0 0 0");
  740.                    %flag.flagStand = "";
  741.                }
  742.                else
  743.                {
  744.                 %holdTeam = GameBase::getTeam(%flag.flagStand);
  745.                     TeamMessages(0, %holdTeam, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(GameBase::getTeam(%flag.flagStand)) @ " flag was returned to base.~wflagreturn.wav");
  746.                    GameBase::setPosition(%flag, GameBase::getPosition(%flag.flagStand));
  747.                %flag.flagStand.flag = %flag;
  748.                    %flag.holdingTeam = %holdTeam;
  749.                    %flag.carrier = -1;
  750.                    $teamScore[%holdTeam] += %flag.scoreValue;
  751.                    $deltaTeamScore[%holdTeam] += %flag.deltaTeamScore;
  752.                    %flag.holder = %flag.flagStand;
  753.                    TeamMessages(0,%holdTeam, "Your team holds " @ %flag.objectiveName @ ".~wflagcapture.wav", -2, "", "The " @ getTeamName(%playerTeam) @ " team holds " @ %flag.objectiveName @ ".");
  754.                    ObjectiveMission::checkScoreLimit();
  755.                }
  756.             }
  757.          else
  758.          {
  759.              TeamMessages(0, %flagTeam, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(%flagTeam) @ " flag was returned to base.~wflagreturn.wav");
  760.                 GameBase::setPosition(%flag, %flag.originalPosition);
  761.             Item::setVelocity(%flag, "0 0 0");
  762.          }
  763.          %flag.atHome = true;
  764.             GameBase::startFadeIn(%flag);
  765.           %flag.fadeOut= "";
  766.             ObjectiveMission::ObjectiveChanged(%flag);
  767.         }
  768.    }
  769. }
  770.  
  771. function Flag::onCollision(%this, %object)
  772. {
  773.    //echo("Flag collision ", %object);
  774.    if(getObjectType(%object) != "Player")
  775.       return;
  776.  
  777.    if(%this.carrier != -1)
  778.       return; // spurious collision
  779.       
  780.    if(Player::isAIControlled(%object))
  781.        return;   
  782.       
  783.    %name = Item::getItemData(%this);
  784.    %playerTeam = GameBase::getTeam(%object);
  785.    %flagTeam = GameBase::getTeam(%this);
  786.    %playerClient = Player::getClient(%object);
  787.    %touchClientName = Client::getName(%playerClient);
  788.                              
  789.  
  790.    if(%flagTeam == %playerTeam)
  791.    {
  792.       // player is touching his own flag...
  793.       if(!%this.atHome)
  794.       {
  795.          // the flag isn't home! so return it.
  796.             GameBase::startFadeOut(%this);
  797.             GameBase::setPosition(%this, %this.originalPosition);
  798.          Item::setVelocity(%this, "0 0 0");
  799.             GameBase::startFadeIn(%this);
  800.          %this.atHome = true;
  801.          MessageAllExcept(%playerClient, 0, %touchClientName @ " returned the " @ getTeamName(%playerTeam) @ " flag!~wflagreturn.wav");
  802.          Client::sendMessage(%playerClient, 0, "You returned the " @ getTeamName(%playerTeam) @ " flag!~wflagreturn.wav");
  803.          teamMessages(1, %playerTeam, "Your flag was returned to base.", -2, "", "The " @ getTeamName(%playerTeam) @ " flag was returned to base.");
  804.          %this.pickupSequence++;
  805.          ObjectiveMission::ObjectiveChanged(%this);
  806.       }
  807.       else
  808.       {
  809.          // it's at home - see if we have an enemy flag!
  810.          if(%object.carryFlag != "")
  811.          {
  812.            // can't cap the neutral flags, duh
  813.                %enemyTeam = GameBase::getTeam(%object.carryFlag);
  814.                if(%enemyTeam != -1)
  815.             {
  816.                MessageAllExcept(%playerClient, 0, %touchClientName @ " captured the " @ getTeamName(%enemyTeam) @ " flag!~wflagcapture.wav");
  817.                Client::sendMessage(%playerClient, 0, "You captured the " @ getTeamName(%enemyTeam) @ " flag!~wflagcapture.wav");
  818.                TeamMessages(1, %playerTeam, "Your team captured the flag.", %enemyTeam, "Your team's flag was captured.");
  819.             
  820.                %flag = %object.carryFlag;
  821.                %flag.atHome = true;
  822.                %flag.carrier = -1;
  823.                %flag.caps[%playerTeam]++;
  824.                %flag.enemyCaps++;
  825.                
  826.                
  827.                Item::hide(%flag, false);
  828.                $flagAtHome[1] = true;
  829.                GameBase::setPosition(%flag, %flag.originalPosition);
  830.                Item::setVelocity(%flag, "0 0 0");
  831.  
  832.                %flag.trainingObjectiveComplete = true;
  833.                ObjectiveMission::ObjectiveChanged(%flag);
  834.  
  835.                Player::setItemCount(%object, Flag, 0);
  836.                %object.carryFlag = "";
  837.                Flag::clearWaypoint(%playerClient, true);
  838.  
  839.                $teamScore[%playerTeam] += %flag.scoreValue;
  840.                ObjectiveMission::checkScoreLimit();
  841.  
  842.                //flag carrier gets 5 points for caputure
  843.                %playerClient.score += 5;
  844.                Game::refreshClientScore(%playerClient);
  845.                messageAll(0, Client::getName(%playerClient) @ " receives 5 point capture bonus.");
  846.             }
  847.          }
  848.       }
  849.    }
  850.    else
  851.    {
  852.       // it's an enemy's flag! woohoo!
  853.       if(%object.carryFlag == "")
  854.       {
  855.             if(%object.outArea == "") {
  856.                 // don't pick up our flags
  857.                 if(%this.holdingTeam == %playerTeam)
  858.                    return;
  859.  
  860.                 Player::setItemCount(%object, Flag, 1);
  861.                 Player::mountItem(%object, Flag, $FlagSlot, %flagTeam);
  862.                 Item::hide(%this, true);
  863.                 $flagAtHome[1] = false;
  864.                 %this.atHome = false;
  865.                 %this.carrier = %object;
  866.                 %this.pickupSequence++;
  867.                 %object.carryFlag = %this;
  868.                  Flag::setWaypoint(%playerClient, %this);
  869.                  if(%this.fadeOut) {
  870.                     GameBase::startFadeIn(%this);
  871.                      %this.fadeOut= "";
  872.                 }
  873.  
  874.                 if((%this.lastTeam == "" || %this.lastTeam != %playerTeam) && %flagTeam == -1) {
  875.                      %this.currentFlagStand="";
  876.                      %this.changeTeamCount++;
  877.                     %this.lastTeam = %playerTeam;
  878.                    %this.timerOn = 1;
  879.                    if($flagToStandTime >= 30) {
  880.                        %timeToStand = $flagToStandTime - 30;
  881.                         %timeLeft = 30;
  882.                        if($flagToStandTime > 30)
  883.                            Client::sendMessage(%playerClient, 0, "You have " @ $flagToStandTime @ " sec to put the flag in a stand.");
  884.                     }
  885.                     else {    
  886.                         if($flagToStandTime >= 10)
  887.                             %remain = $flagToStandTime % 10;
  888.                         else 
  889.                             %remain = $flagToStandTime % 5;
  890.                         
  891.                         if(%remain > 0 && %remain != $flagToStandTime) {
  892.                             %timeToStand = %remain;
  893.                             %timeLeft = $flagToStandTime - %remain;
  894.                            Client::sendMessage(%playerClient, 0, "You have " @ $flagToStandTime @ " sec to put the flag in a stand.");
  895.                         }
  896.                         else {
  897.                             %timeToStand = 0;
  898.                             %timeLeft = $flagToStandTime;
  899.                         }
  900.                     }
  901.  
  902.                    schedule("Flag::checkFlagsTime(" @ %this @"," @ %timeLeft @ "," @ %this.changeTeamCount @ ");",%timeToStand);
  903.                 }
  904.  
  905.                 if(%flagTeam != -1)
  906.                 {
  907.                     MessageAllExcept(%playerClient, 0, %touchClientName @ " took the " @ getTeamName(%flagTeam) @ " flag! ~wflag1.wav");
  908.                    Client::sendMessage(%playerClient, 0, "You took the " @ getTeamName(%flagTeam) @ " flag! ~wflag1.wav");
  909.                    TeamMessages(1, %playerTeam, "Your team has the " @ getTeamName(%flagTeam) @ " flag.", %flagTeam, "Your team's flag has been taken.");
  910.                 }
  911.                 else
  912.                 {
  913.                    %hteam = %this.holdingTeam;
  914.                     if(%hteam != -1)
  915.                    {
  916.                       $teamScore[%hteam] -= %this.scoreValue;
  917.                       $deltaTeamScore[%hteam] -= %this.deltaTeamScore;
  918.  
  919.                        MessageAllExcept(%playerClient, 0, %touchClientName @ " took " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.~wflag1.wav");
  920.                       Client::sendMessage(%playerClient, 0, "You took " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.~wflag1.wav");
  921.                       TeamMessages(1, %playerTeam, "Your team has " @ %this.objectiveName @ ".", %hteam, "Your team lost " @ %this.objectiveName @ ".", "The " @ getTeamName(%playerTeam) @ " team has taken " @ %this.objectiveName @ " from the " @ getTeamName(%hteam) @ " team.");
  922.                       %this.holdingTeam = -1;
  923.                       %this.holder.flag = "";
  924.                    }
  925.                    else
  926.                    {
  927.                        MessageAllExcept(%playerClient, 0, %touchClientName @ " took " @ %this.objectiveName @ ".~wflag1.wav");
  928.                       Client::sendMessage(%playerClient, 0, "You took " @ %this.objectiveName @ ".~wflag1.wav");
  929.                       TeamMessages(1, %playerTeam, "Your team has " @ %this.objectiveName @ ".", -2, "", "The " @ getTeamName(%playerTeam) @ " team has taken " @ %this.objectiveName @ ".");
  930.                    }
  931.                 }
  932.                 %this.trainingObjectiveComplete = true;
  933.                 ObjectiveMission::ObjectiveChanged(%this);
  934.             }
  935.             else
  936.                 Client::sendMessage(%playerClient, 1, "Flag not in mission area.");
  937.         }
  938.    }
  939. }
  940.  
  941. function Flag::checkFlagsTime(%flag,%timeleft,%changeCount)
  942. {
  943.     if(%flag.changeTeamCount == %changeCount)
  944.     {
  945.         %client = Player::getClient(%flag.carrier);
  946.         if(%timeleft <= 0 && %flag.currentFlagStand == "") { 
  947.             GameBase::startFadeOut(%flag);
  948.           Player::setItemCount(%flag.carrier, "Flag", 0);
  949.              %clientName = Client::getName(%client);
  950.            %flagTeam = GameBase::getTeam(%flag);
  951.              if(%flagTeam == -1 && (%flag.flagStand == "" || (%flag.flagStand).flag != "") ) 
  952.            {
  953.               if(%client != -1) {
  954.                   MessageAllExcept(%client, 0, %clientName @ " didn't put " @ %flag.objectiveName @ " in a flag stand in time!  It was returned to its initial position.");
  955.                   Client::sendMessage(%client, 0, "You didn't get " @ %flag.objectiveName @ " to a flag stand in time!  It was returned to its initial position.");
  956.                 }
  957.                 else
  958.                   MessageAll(0, %flag.objectiveName @ " was not put in a flag stand in time!  It was returned to its initial position.");
  959.                 GameBase::setPosition(%flag, %flag.originalPosition);
  960.              Item::setVelocity(%flag, "0 0 0");
  961.                 %flag.flagStand = "";
  962.            }
  963.            else
  964.            {
  965.                 if(%flagTeam != -1) {
  966.                     %team = %flagTeam;
  967.                     GameBase::setPosition(%flag, %flag.originalPosition);
  968.                 Item::setVelocity(%flag, "0 0 0");
  969.                 }
  970.                 else {
  971.                     %team = GameBase::getTeam(%flag.flagStand);
  972.                     GameBase::setPosition(%flag, GameBase::getPosition(%flag.flagStand));
  973.                 Item::setVelocity(%flag, "0 0 0");
  974.                 }
  975.                 if(%client != -1) {
  976.                   MessageAllExcept(%client, 0, %clientName @ " didn't put " @ %flag.objectiveName @ " in a flag stand in time!");
  977.                   Client::sendMessage(%client, 0, "You didn't get " @ %flag.objectiveName @ " to a flag stand in time!");
  978.               }
  979.               else
  980.                   MessageAll(0, %flag.objectiveName @ " was not put in a flag stand in time!");
  981.               TeamMessages(1, %team, %flag.objectiveName @ " was returned to your base.~wflagreturn.wav", -2, "", %flag.objectiveName @ " was returned to the " @ getTeamName(%team) @ " base.");
  982.               %holdTeam = GameBase::getTeam(%flag.flagStand);
  983.                $teamScore[%holdTeam] += %flag.scoreValue;
  984.                $deltaTeamScore[%holdTeam] += %flag.deltaTeamScore;
  985.                 %flag.holder = %flag.flagStand;
  986.                %flag.flagStand.flag = %flag;
  987.                 %flag.holdingTeam = %holdTeam;
  988.             }
  989.             GameBase::startFadeIn(%flag);
  990.             Item::hide(%flag, false);
  991.  
  992.             (%flag.carrier).carryFlag = "";
  993.           %flag.carrier = -1;
  994.             Flag::clearWaypoint(%client, false);
  995.           ObjectiveMission::ObjectiveChanged(%flag);
  996.             ObjectiveMission::checkScoreLimit();
  997.             %flag.lastTeam = "";
  998.         }
  999.         else if(%flag.currentFlagStand == "") {
  1000.             Client::sendMessage(%client, 0, "You have " @ %timeleft @ " sec to put the flag in a stand.");
  1001.             if(%timeleft <= 5) {
  1002.                 %timeleft--;
  1003.                 %nextTime = 1;
  1004.             }
  1005.             else if(%timeleft == 10) { 
  1006.                 %timeleft -= 5;
  1007.                 %nextTime = 5;
  1008.             }
  1009.             else {
  1010.                 %timeleft -= 10;
  1011.                 %nextTime = 10;
  1012.             }
  1013.           schedule("Flag::checkFlagsTime(" @ %flag @","@ %timeleft @"," @ %changeCount @ ");",%nextTime);
  1014.         }
  1015.     }
  1016. }
  1017.  
  1018. function Flag::clearWaypoint(%client, %success)
  1019. {
  1020.    if(%success)
  1021.       setCommandStatus(%client, 0, "Objective completed.~wobjcomp");
  1022.    else
  1023.       setCommandStatus(%client, 0, "Objective failed.");
  1024. }
  1025.  
  1026. function Flag::setWaypoint(%client, %flag)
  1027. {
  1028.    if(!%client.autoWaypoint)
  1029.       return;
  1030.    %flagTeam = GameBase::getTeam(%flag);
  1031.    %team = Client::getTeam(%client);
  1032.  
  1033.     if(%flagTeam == -1)
  1034.     { 
  1035.         for(%s = $teamFlagStand[%team]; %s != ""; %s = %s.nextFlagStand) 
  1036.         {
  1037.             if(%s.flag == "") {
  1038.                 %pos = GameBase::getPosition(%s);
  1039.                 %posX = getWord(%pos,0);
  1040.                 %posY = getWord(%pos,1);
  1041.               issueCommand(%client, %client, 0,"Take " @ %flag.objectiveName @ " to empty flag stand.~wcapobj", %posX, %posY);
  1042.                 return;
  1043.             }
  1044.       }
  1045.     }
  1046.     else
  1047.     {
  1048.         %pos = ($teamFlag[%team]).originalPosition;
  1049.         %posX = getWord(%pos,0);
  1050.         %posY = getWord(%pos,1);
  1051.          issueCommand(%client, %client, 0,"Take the " @ getTeamName(%flagTeam) @ " flag to our flag.~wcapobj", %posX, %posY);
  1052.         return;
  1053.     }
  1054. }
  1055.  
  1056. function FlagStand::objectiveInit(%this)
  1057. {
  1058.    %this.flag = "";
  1059.    %team = GameBase::getTeam(%this);
  1060.  
  1061.    %this.nextFlagStand = $teamFlagStand[%team];
  1062.    $teamFlagStand[%team] = %this;
  1063.     
  1064.    return false;
  1065. }
  1066.  
  1067. function FlagStand::onCollision(%this, %object)
  1068. {
  1069.    //echo("FlagStand collision ", %object);
  1070.    %standTeam = GameBase::getTeam(%this);
  1071.    %playerTeam = GameBase::getTeam(%object);
  1072.  
  1073.    if(%standTeam == -1 || getObjectType(%object) != "Player" || %object.carryFlag == ""
  1074.          || %playerTeam != %standTeam || %this.flag != "" || GameBase::getTeam(%object.carryFlag) != -1)
  1075.       return;
  1076.  
  1077.    // if we're here, we're carrying a flag, we've hit 
  1078.    // our flag stand, it doesn't have a flag, and we're not carrying
  1079.    // a team coded flag.
  1080.  
  1081.    %flag = %object.carryFlag;
  1082.    %flag.carrier = -1;
  1083.    Item::hide(%flag, false);
  1084.    GameBase::setPosition(%flag, GameBase::getPosition(%this));
  1085.     %flag.flagStand = %this;
  1086.    Player::setItemCount(%object, Flag, 0);
  1087.    %object.carryFlag = "";
  1088.    %playerClient = Player::getClient(%object);
  1089.    Flag::clearWaypoint(%playerClient, true);
  1090.  
  1091.    $teamScore[%playerTeam] += %flag.scoreValue;
  1092.    $deltaTeamScore[%playerTeam] += %flag.deltaTeamScore;
  1093.    %flag.holder = %this;
  1094.    %flag.holdingTeam = %playerTeam;
  1095.    %this.flag = %flag;
  1096.     %flag.currentFlagStand = %this;
  1097.  
  1098.    MessageAllExcept(%playerClient, 0, Client::getName(%playerClient) @ " conveyed " @ %flag.objectiveName @ " to base.");
  1099.    Client::sendMessage(%playerClient, 0, "You conveyed " @ %flag.objectiveName @ " to base.");
  1100.    TeamMessages(1, %playerTeam, "Your team holds " @ %flag.objectiveName @ ".~wflagcapture.wav", -2, "", "The " @ getTeamName(%playerTeam) @ " team holds " @ %flag.objectiveName @ ".");
  1101.  
  1102.    %flag.trainingObjectiveComplete = true;
  1103.    ObjectiveMission::ObjectiveChanged(%flag);
  1104.    ObjectiveMission::checkScoreLimit();
  1105. }
  1106.  
  1107. function Flag::clientKilled(%this, %playerId, %killerId)
  1108. {
  1109.    %player = Client::getOwnedObject(%playerId);
  1110.    %killer = Client::getOwnedObject(%killerId);
  1111.  
  1112.    if(%player == -1 || %killer == -1)
  1113.       return;
  1114.  
  1115.    %flagTeam = GameBase::getTeam(%this);
  1116.    if(%flagTeam == -1)
  1117.       return;
  1118.  
  1119.    %playerTeam = GameBase::getTeam(%player);
  1120.    %killerTeam = GameBase::getTeam(%killer);
  1121.  
  1122.    if(%playerTeam == %killerTeam)
  1123.       return;
  1124.  
  1125.    // killer's the only guy who gets a bonus.
  1126.    if(%killerTeam == %flagTeam)
  1127.    {
  1128.       // check for defending the flag
  1129.       // only if the flag is not being carried
  1130.       if(%this.carrier == -1)
  1131.       {
  1132.          %flagPos = GameBase::getPosition(%this);
  1133.          %playerPos = GameBase::getPosition(%player);
  1134.  
  1135.          if(Vector::getDistance(%flagPos, %playerPos) < 80)
  1136.          {
  1137.             %killerId.score++;
  1138.             Game::refreshClientScore(%killerId);
  1139.             messageAll(0, Client::getName(%killerId) @ " gets a bonus for defending the flag!");
  1140.          }
  1141.       }
  1142.    }
  1143.    else
  1144.    {
  1145.       if(%this.carrier != -1)
  1146.       {
  1147.          %carrierTeam = GameBase::getTeam(%this.carrier);
  1148.          // check for defending the carrier bonus
  1149.          if(%carrierTeam == %killerTeam)
  1150.          {
  1151.             if(Vector::getDistance(GameBase::getPosition(%this.carrier),
  1152.                GameBase::getPosition(%killer)) < 80)
  1153.             {
  1154.                %killerId.score++;
  1155.                Game::refreshClientScore(%killerId);
  1156.                messageAll(0, Client::getName(%killerId) @ " gets a bonus for defending the flag carrier!");
  1157.             }               
  1158.          }
  1159.       }
  1160.    }
  1161. }
  1162.  
  1163. function Flag::clientDropped(%this, %clientId)
  1164. {
  1165.    //echo(%this @ " " @ %clientId);
  1166.    %type = Player::getMountedItem(%clientId, $FlagSlot);
  1167.    if(%type != -1)
  1168.       Player::dropItem(%clientId, %type);
  1169. }
  1170.  
  1171. function Flag::playerLeaveMissionArea(%this, %playerId)
  1172. {
  1173.    // if a guy leaves the area, warp the flag back to its base
  1174.    if(%this.carrier == %playerId)
  1175.    {
  1176.         GameBase::startFadeOut(%this);
  1177.       Player::setItemCount(%playerId, "Flag", 0);
  1178.         %playerClient = Player::getClient(%playerId);
  1179.          %clientName = Client::getName(%playerClient);
  1180.        %flagTeam = GameBase::getTeam(%this);
  1181.          if(%flagTeam == -1 && (%this.flagStand == "" || (%this.flagStand).flag != "") ) 
  1182.        {
  1183.           MessageAllExcept(%playerClient, 0, %clientName @ " left the mission area while carrying " @ %this.objectiveName @ "!  It was returned to its initial position.");
  1184.           Client::sendMessage(%playerClient, 0, "You left the mission area while carrying " @ %this.objectiveName @ "!  It was returned to its initial position.");
  1185.             GameBase::setPosition(%this, %this.originalPosition);
  1186.          Item::setVelocity(%this, "0 0 0");
  1187.             %this.flagStand = "";
  1188.        }
  1189.        else
  1190.        {
  1191.             if(%flagTeam != -1) {
  1192.                 %team = %flagTeam;
  1193.                 GameBase::setPosition(%this, %this.originalPosition);
  1194.             Item::setVelocity(%this, "0 0 0");
  1195.             }
  1196.             else {
  1197.                 %team = GameBase::getTeam(%this.flagStand);
  1198.                 GameBase::setPosition(%this, GameBase::getPosition(%this.flagStand));
  1199.             Item::setVelocity(%this, "0 0 0");
  1200.             }
  1201.             MessageAllExcept(%playerClient, 0, %clientName @ " left the mission area while carrying the " @ getTeamName(%team) @ " flag!");
  1202.           Client::sendMessage(%playerClient, 0, "You left the mission area while carrying the " @ getTeamName(%team) @ " flag!");
  1203.           TeamMessages(1, %team, "Your flag was returned to base.~wflagreturn.wav", -2, "", "The " @ getTeamName(%team) @ " flag was returned to base.");
  1204.           %holdTeam = GameBase::getTeam(%this.flagStand);
  1205.            $teamScore[%holdTeam] += %this.scoreValue;
  1206.            $deltaTeamScore[%holdTeam] += %this.deltaTeamScore;
  1207.             %this.holder = %this.flagStand;
  1208.            %this.flagStand.flag = %this;
  1209.             %this.holdingTeam = %holdTeam;
  1210.         }
  1211.         GameBase::startFadeIn(%this);
  1212.       %this.carrier = -1;
  1213.         Item::hide(%this, false);
  1214.  
  1215.         %playerId.carryFlag = "";
  1216.       Flag::clearWaypoint(%playerClient, false);
  1217.       ObjectiveMission::ObjectiveChanged(%this);
  1218.         ObjectiveMission::checkScoreLimit();
  1219.    }
  1220. }
  1221.  
  1222. function Sensor::objectiveInit(%this)
  1223. {
  1224.    return StaticShape::objectiveInit(%this);
  1225. }
  1226.  
  1227. function Turret::objectiveInit(%this)
  1228. {
  1229.    return StaticShape::objectiveInit(%this);
  1230. }
  1231.  
  1232. function StaticShape::objectiveInit(%this)
  1233. {
  1234.    %this.destroyerTeam = "";
  1235.    return %this.scoreValue != "";
  1236. }
  1237.  
  1238. function Sensor::getObjectiveString(%this, %forTeam)
  1239. {
  1240.    return StaticShape::getObjectiveString(%this, %forTeam);
  1241. }
  1242.  
  1243. function Turret::getObjectiveString(%this, %forTeam)
  1244. {
  1245.    return StaticShape::getObjectiveString(%this, %forTeam);
  1246. }
  1247.  
  1248. function StaticShape::getObjectiveString(%this, %forTeam)
  1249. {
  1250.    %thisTeam = GameBase::getTeam(%this);
  1251.    if(%this.destroyerTeam != "")
  1252.    {
  1253.       if(%forTeam == %this.destroyerTeam && %thisTeam != %forTeam)
  1254.          return "<Bitemok.bmp>\nYour team successfully destroyed the " @ getTeamName(%thisTeam) @ " " @ %this.objectiveName @ " objective.";
  1255.       else if(%forTeam == %thisTeam)
  1256.          return "<Bitem_damaged.bmp>\nYour team failed to defend " @ %this.objectiveName;
  1257.       else
  1258.          return "<Bitem_ok.bmp>\n" @ getTeamName(%this.destroyerTeam) @ " team destroyed the " @ getTeamName(%thisTeam) @ " " @ %this.objectiveName @ " objective.";
  1259.    }
  1260.    else
  1261.    {
  1262.       if($missionComplete)
  1263.       {
  1264.          if(%forTeam != -1) {
  1265.                 if(%forTeam == %thisTeam)
  1266.                 return "<Bitem_ok.bmp>\nYour team successfully defended " @ %this.objectiveName @ ".";
  1267.              else
  1268.                 return "<Bitem_damaged.bmp>\nYour team failed to destroy " @ getTeamName(%thisTeam) @ " objective, " @ %this.objectiveName @ ".";
  1269.           }
  1270.             else 
  1271.                return "<Bitem_ok.bmp>\n" @ getTeamName(%thisTeam) @ " failed to destroy the " @ %this.objectiveName @ " objective.";
  1272.         }
  1273.       else
  1274.       {
  1275.          if(%forTeam != -1) {
  1276.              if(%forTeam == %thisTeam)
  1277.                 return "<Bitem_ok.bmp>\nDefend " @ %this.objectiveName @ ".";
  1278.              else
  1279.                   return "<Bitem_damaged.bmp>\nDestroy " @ getTeamName(%thisTeam) @ " objective, " @ %this.objectiveName @ "(" @ %this.scoreValue @ " points).";
  1280.           }
  1281.             else 
  1282.                return "<Bitem_ok.bmp>\n" @ getTeamName(%thisTeam) @ " must defend the " @ %this.objectiveName @ " objective.";
  1283.  
  1284.       }
  1285.    }
  1286. }
  1287.  
  1288. function StaticShape::timeLimitReached(%this)
  1289. {
  1290.    if(%this.scoreValue && !%this.destroyerTeam)
  1291.    {
  1292.       // give the defense some props!
  1293.       $teamScore[GameBase::getTeam(%this)] += %this.scoreValue;
  1294.    }
  1295. }
  1296.  
  1297. function StaticShape::objectiveDestroyed(%this)
  1298. {
  1299.     if(%this.destroyed == "") {
  1300.        // test if it's really an objective
  1301.        if(!%this.objectiveLine)
  1302.           return;
  1303.        %destroyerTeam = %this.lastDamageTeam;
  1304.         %thisTeam = GameBase::getTeam(%this);
  1305.       %playerClient = GameBase::getControlClient(%this.lastDamageObject);
  1306.       if(%playerClient != -1)
  1307.          %clientName = Client::getName(%playerClient);
  1308.  
  1309.        if(%thisTeam == %destroyerTeam)
  1310.        {
  1311.           // uh-oh... we killed our own stuff.
  1312.           // award the points to everyone else
  1313.           for(%i = 0; %i < getNumTeams(); %i++)
  1314.           {
  1315.              if(%i == %thisTeam)
  1316.                 continue;
  1317.              $teamScore[%i] += %this.scoreValue;
  1318.           }
  1319.          if(%playerClient != -1)
  1320.          {
  1321.              MessageAllExcept(%playerClient, 0, %clientName @ " destroyed a friendly objective.");
  1322.              Client::sendMessage(%playerClient, 0, "You destroyed a friendly objective!");
  1323.          }
  1324.          MessageAll(1, getTeamName(%destroyerTeam) @ " objective " @ %this.objectiveName @ " destroyed.");
  1325.        }
  1326.        else
  1327.        {
  1328.           $teamScore[%destroyerTeam] += %this.scoreValue;
  1329.          if(%playerClient != -1)
  1330.          {
  1331.                %playerClient.score+=5;
  1332.                 Game::refreshClientScore(%playerClient);
  1333.              MessageAllExcept(%playerClient, 0, %clientName @ " destroyed an objective!");
  1334.              Client::sendMessage(%playerClient, 0, "You destroyed an objective!");
  1335.          }
  1336.          MessageAll(1, getTeamName(%thisTeam) @ " objective " @ %this.objectiveName @ " destroyed.");
  1337.        }
  1338.        %this.destroyerTeam = %destroyerTeam;
  1339.        ObjectiveMission::ObjectiveChanged(%this);
  1340.        ObjectiveMission::checkScoreLimit();
  1341.         %this.destroyed = 1;
  1342.     }
  1343. }
  1344.  
  1345. function StaticShape::objectiveDisabled(%this)
  1346. {
  1347. }
  1348.  
  1349.  
  1350.